home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 23 / AMIGAplus Sonderheft 23 (2000)(Falke)(DE)[!].iso / Updates / HD-Installer / -WHDLoad- / WHDLoad_dev / Patcher1.04 / PARAMQTX / imagernitro.asm < prev    next >
Assembly Source File  |  1999-11-08  |  17KB  |  848 lines

  1. ;another example of a formatconversion, this time for a hd-install
  2. ;the nitro-disk has a really strange decoding-routine
  3. ;have a look on that table-changes while execution
  4.  
  5.     INCDIR    ASM-ONE:INCLUDE2.0/
  6.  
  7.     INCLUDE    OWN/Patcher.I
  8.     INCLUDE    DEVICES/TRACKDISK.I
  9.     INCLUDE    EXEC/EXEC_LIB.I
  10.     INCLUDE    EXEC/IO.I
  11.     INCLUDE    LIBRARIES/DOS_LIB.I
  12.  
  13. MYNITRO=0
  14.  
  15.  
  16. HP    MOVEQ.L    #20,D0
  17.     RTS
  18.     DC.L    TAB
  19.     DC.B    'PTCH'
  20.     DC.B    '$VER:Nitro_Diskimager_V1.1',0
  21.     EVEN
  22.  
  23. TAB    DC.L    PCH_INIT,INITROUT
  24.     DC.L    PCH_FILECOUNT,3
  25.     DC.L    PCH_ADAPTOR,ADNAME
  26.     DC.L    PCH_DISKNAME,DISKNAMEARRAY
  27.     DC.L    PCH_FILENAME,FILENAMEARRAY
  28.     DC.L    PCH_CHANGES,CHANGESARRAY    
  29.     DC.L    PCH_NAME,PARAMNAME
  30.     DC.L    PCH_DATALENGTH,LENGTHTABLE
  31.     DC.L    PCH_SPECIAL,SPECIALARRAY
  32.     DC.L    PCH_STATE,STATEARRAY
  33.     DC.L    PCH_STATE2,STATEARRAY2
  34.     DC.L    PCH_MINVERSION,VERSNAME        ;minimum version of THE PATCHER
  35.     DC.L    0
  36.  
  37. ;minimum version of the patcher required, its a commandline-parameter
  38. VERSNAME    DC.B    'V1.01'        ;MAY NOT CONTAIN HEADING ZEROES
  39.     EVEN                ;MUST CONTAIN 2 NUMBERS AFTER POINT
  40.  
  41.  
  42. ADNAME    DC.B    'Done by Harry.',0
  43.     EVEN
  44.  
  45.  
  46. PARAMNAME    DC.B    'Nitro, Diskimager for HD-install',0
  47.     EVEN
  48.  
  49.  
  50. DISKNAMEARRAY    DC.L    DISK1NAME
  51.     DC.L    DISK1NAME
  52.     DC.L    DISK1NAME
  53.  
  54. DISK1NAME    DC.B    'Nitro',0
  55.     EVEN
  56.  
  57.  
  58. FILENAMEARRAY    DC.L    FILE1NAME
  59.     DC.L    FILE2NAME
  60.     DC.L    FILE3NAME
  61.  
  62. FILE2NAME    DC.B    'disk.1',0
  63.     EVEN
  64. FILE1NAME    DC.B    'init',0
  65.     EVEN
  66. FILE3NAME    DC.B    'high',0
  67.     EVEN
  68.  
  69. LENGTHTABLE    DC.L    $1200
  70.     DC.L    $0            ;WILL BE EVALUATED IN CYCLE1
  71.     DC.L    $140            ;HIGHSCORE!
  72.  
  73. CHANGESARRAY    DC.L    0        ;no changes to make in cycle 1
  74.     DC.L    0            ;no changes to make in cycle 2
  75.     DC.L    0            ;if no highscores were on disk,
  76.                     ;they will be generated
  77.  
  78. ;the parameter-initializing opens sourcedevice 
  79. INITROUT
  80.     MOVEQ.L    #0,D0
  81.     MOVE.L    PTB_OPENDEVICE(A5),A0
  82.     JSR    (A0)
  83.     TST.L    D0
  84.     RTS
  85.  
  86. ;loading-statetexts for the cycles
  87. STATEARRAY    DC.L    LOADSTATE2
  88.     DC.L    LOADSTATE2
  89.     DC.L    LOADSTATE2
  90.  
  91.  
  92. LOADSTATE2
  93.     DC.B    'Please insert your original writepro-',$A
  94.     DC.B    'tected disk in the source drive.',0
  95.     EVEN
  96.  
  97. STATEARRAY2    DC.L    SAVESTATE        ;no text in cycle 1
  98.     DC.L    SAVESTATE
  99.     DC.L    SAVESTATE
  100.  
  101.  
  102. SAVESTATE    
  103.     DC.B    'Please insert your destination disk.',0
  104.     EVEN
  105.  
  106. ;routines to 'load' something
  107. SPECIALARRAY    DC.L    LOADROUT2    ;load dual-formatted track 0
  108.     DC.L    LOADROUT        ;load stuff from original
  109.     DC.L    LOADROUT3        ;load highscore
  110.  
  111. LOADROUT2
  112.     MOVEQ.L    #0,D7
  113. .NEU
  114. .4    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  115.     MOVE.W    #TD_CHANGESTATE,IO_COMMAND(A1)
  116.     MOVE.L    (_SYSBASE).W,A6
  117.     JSR    _LVODOIO(A6)
  118.     TST.L    IO_ACTUAL(A1)
  119.     BNE.W    .NOTORG
  120.  
  121.     MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  122.     MOVE.L    PTB_ADDRESSOFFILE(A5),IO_DATA(A1)
  123.     MOVE.L    #$1200,IO_LENGTH(A1)
  124.     MOVE.L    #$400,IO_OFFSET(A1)
  125.     MOVE.W    #CMD_READ,IO_COMMAND(A1)
  126.     CLR.L    IOTD_SECLABEL(A1)
  127.     MOVE.L    (_SYSBASE).W,A6
  128.     JSR    _LVODOIO(A6)
  129.     TST.L    D0
  130.     BNE.W    .ERR
  131.  
  132.                     ;LOAD CHECKDISKTRACK
  133.     MOVEQ.L    #0,D2
  134.     LEA.L    TRACKDATALENGTH(PC),A2
  135.     MOVEQ.L    #0,D4
  136.  
  137. .3    TST.L    D4
  138.     BNE.S    .1
  139.  
  140.  
  141. .5    MOVEQ.L    #$4,D5                ;4 tries, then error
  142. .55    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  143.     MOVE.L    PTB_SPACE(A5),IO_DATA(A1)    ;track is to load in PTB_SPACE
  144.     MOVE.L    #$7C00,IO_LENGTH(A1)        ;double length of track
  145.                         ;to decode the index-sync-read data
  146.     MOVE.L    D2,D0                ;my own trackcounter
  147.     MOVE.L    D0,IO_OFFSET(A1)
  148.     MOVE.W    #TD_RAWREAD,IO_COMMAND(A1)
  149.     MOVE.B    #IOTDB_INDEXSYNC,IO_FLAGS(A1)
  150.     MOVE.L    (_SYSBASE).W,A6
  151.     JSR    _LVODOIO(A6)
  152.     TST.L    D0
  153.     BNE.W    .ERR
  154.     MOVE.L    PTB_SPACE(A5),A0
  155.     LEA.L    $7C00(A0),A1            ;end of buffer
  156.     LEA.L    $7C02(A0),A3
  157.     BSR.W    TRACKDECODE3
  158.     TST.L    D0
  159.     BEQ.S    .OK
  160.     DBF    D5,.55
  161.     BRA.W    .NOTORG
  162.  
  163. .OK
  164.     CMP.L    #'tb_1',(A3)            ;nitro-diskname
  165.     BNE.S    .ERR
  166.  
  167.     LEA.L    $8(A3),A3
  168.     MOVE.L    #$A0,D3
  169.  
  170. .1    MOVE.L    D4,D0
  171.     LSL.L    #1,D0
  172.     MOVE.W    (A3,D0.W),D0
  173.     AND.W    #$FFF,D0
  174.     MOVE.W    D0,(A2)+
  175.     ADDQ.L    #1,D4
  176.     CMP.W    D3,D4                ;tracklength
  177.     BNE.S    .2
  178.     MOVEQ.L    #0,D4                ;new track
  179. .2
  180.     TST.L    D4
  181.     BNE.S    .3
  182.  
  183.     LEA.L    TRACKDATALENGTH,A0        ;evaluate disksize needed in
  184.     MOVEQ.L    #0,D0                ;next cycle (cycle 2)
  185. .T1    MOVEQ.L    #0,D1
  186.     MOVE.W    (A0)+,D1
  187.     ADD.L    D1,D0
  188.     CMP.L    #TRACKDATALENGTHEND,A0
  189.     BNE.S    .T1
  190.     LSL.L    #2,D0
  191.     MOVE.L    D0,LENGTHTABLE+4        ;store length in right table
  192. ;            ^-^-^-^-^-^
  193.  
  194.     MOVEQ.L    #0,D4
  195. .END    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  196.     MOVE.L    #0,IO_LENGTH(A1)
  197.     MOVE.W    #TD_MOTOR,IO_COMMAND(A1)
  198.     MOVE.L    (_SYSBASE).W,A6
  199.     JSR    _LVODOIO(A6)
  200.  
  201.     MOVE.L    D4,D0
  202.     RTS
  203.  
  204. .ERR    MOVEQ.L    #-1,D4
  205.     BRA.S    .END
  206.  
  207. .NOTORG    TST.L    D7
  208.     BNE.S    .ERR
  209.     ST    D7
  210.     LEA.L    LINE1(PC),A0
  211.     LEA.L    LINE2(PC),A1
  212.     MOVE.L    PTB_REQUEST(A5),A6
  213.     JSR    (A6)
  214.     TST.L    D0
  215.     BNE.S    .ERR
  216.     BRA.W    .NEU
  217.  
  218.  
  219. LOADROUT
  220. ;.xxx    bra.s    .xxx
  221.     MOVEQ.L    #0,D7                ;one diskchange allowed
  222. .NEU
  223. .4    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;disk in sourcedrive?
  224.     MOVE.W    #TD_CHANGESTATE,IO_COMMAND(A1)
  225.     MOVE.L    (_SYSBASE).W,A6
  226.     JSR    _LVODOIO(A6)
  227.     TST.L    IO_ACTUAL(A1)
  228.     BNE.W    .NOTORG
  229.  
  230.     MOVE.L    PTB_ADDRESSOFFILE(A5),A4    ;load first part of disk
  231.     LEA.L    (A4),A2            ;offset to load in the dataspace
  232.     MOVEQ.L    #0,D2                ;starttrack on the disk
  233.     MOVEQ.L    #0,D4                ;data from the start of the track
  234. ;    bra.s    .5                ;because reading starts with
  235.                         ;trackstart, this is obsolete
  236.  
  237. .3    TST.L    D4
  238.     BNE.W    .1
  239.     MOVE.L    D2,D0
  240.     LSL.L    #1,D0
  241.     LEA.L    TRACKDATALENGTH(PC),A0
  242.     TST.W    (A0,D0.W)
  243.     BEQ.W    .SKIPEMPTY
  244.  
  245. .5    MOVEQ.L    #$4,D5                ;4 tries, then error
  246. .55    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  247.     MOVE.L    PTB_SPACE(A5),IO_DATA(A1)    ;track is to load in PTB_SPACE
  248.     MOVE.L    #$7C00,IO_LENGTH(A1)        ;double length of track
  249.                         ;to decode the index-sync-read data
  250.     MOVE.L    D2,D0                ;my own trackcounter
  251.     MOVE.L    D0,IO_OFFSET(A1)
  252.     MOVE.W    #TD_RAWREAD,IO_COMMAND(A1)
  253.     MOVE.B    #IOTDB_INDEXSYNC,IO_FLAGS(A1)
  254.     MOVE.L    (_SYSBASE).W,A6
  255.     JSR    _LVODOIO(A6)
  256.     TST.L    D0
  257.     BNE.W    .ERR
  258.     MOVE.L    #$AAAAAAAA,ANDVALUE
  259.     MOVE.L    PTB_SPACE(A5),A0
  260.     LEA.L    $7C00(A0),A1            ;end of buffer
  261.     LEA.L    $7C00(A0),A3
  262.     BSR.W    TRACKDECODE2
  263.     TST.L    D0
  264.     BEQ.S    .R1OK
  265.     MOVE.L    #$55555555,ANDVALUE
  266.     MOVE.L    PTB_SPACE(A5),A0
  267.     LEA.L    $7C00(A0),A1            ;end of buffer
  268.     LEA.L    $7C00(A0),A3
  269.     BSR.W    TRACKDECODE2
  270.     TST.L    D0
  271.     BEQ.S    .R1OK
  272.     DBF    D5,.55
  273.     BRA.W    .NOTORG
  274.  
  275. .R1OK    MOVE.W    D1,D3
  276.     LSL.W    #2,D3
  277.     ST    D7                ;correct disk - nothing anymore
  278.                         ;to change
  279. .1    MOVE.B    (A3,D4.W),(A2)+
  280.     ADDQ.L    #1,D4
  281.     CMP.W    D3,D4                ;tracklength
  282.     BNE.S    .2
  283. .SKIPEMPTY
  284.     MOVEQ.L    #0,D4                ;new track
  285.     ADDQ.L    #1,D2
  286. .2
  287.     TST.L    D4
  288.     BNE.W    .3
  289.     CMP.L    #$A0,D2                ;UNTIL END OF DISK IS REACHED
  290.     BNE.W    .3
  291.  
  292.     MOVEQ.L    #0,D4
  293. .END    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;switch motor off
  294.     MOVE.L    #0,IO_LENGTH(A1)
  295.     MOVE.W    #TD_MOTOR,IO_COMMAND(A1)
  296.     MOVE.L    (_SYSBASE).W,A6
  297.     JSR    _LVODOIO(A6)
  298.  
  299.     MOVE.L    D4,D0
  300.     RTS
  301.  
  302. .ERR    MOVEQ.L    #-1,D4
  303.     BRA.S    .END
  304.  
  305. .NOTORG    TST.L    D7            ;if the first time the original
  306.     BNE.S    .ERR            ;was not in the source drive,
  307.     ST    D7            ;youll be asked to put it there
  308.     LEA.L    LINE1(PC),A0
  309.     LEA.L    LINE2(PC),A1
  310.     MOVE.L    PTB_REQUEST(A5),A6
  311.     JSR    (A6)
  312.     TST.L    D0
  313.     BNE.S    .ERR
  314.     BRA.W    .NEU
  315.  
  316.  
  317. LOADROUT3
  318.     MOVEQ.L    #0,D7                ;one diskchange allowed
  319. .NEU
  320. .4    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;disk in sourcedrive?
  321.     MOVE.W    #TD_CHANGESTATE,IO_COMMAND(A1)
  322.     MOVE.L    (_SYSBASE).W,A6
  323.     JSR    _LVODOIO(A6)
  324.     TST.L    IO_ACTUAL(A1)
  325.     BNE.W    .NOTORG
  326.  
  327.     MOVE.L    PTB_ADDRESSOFFILE(A5),A4    ;load first part of disk
  328.     LEA.L    (A4),A2            ;offset to load in the dataspace
  329.     MOVEQ.L    #2,D2                ;starttrack on the disk
  330.     MOVEQ.L    #0,D4                ;data from the start of the track
  331. ;    bra.s    .5                ;because reading starts with
  332.                         ;trackstart, this is obsolete
  333.  
  334. .3    TST.L    D4
  335.     BNE.W    .1
  336. .5    MOVEQ.L    #$4,D6                ;4 tries, then error
  337. .55    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  338.     MOVE.L    PTB_SPACE(A5),IO_DATA(A1)    ;track is to load in PTB_SPACE
  339.     MOVE.L    #$7C00,IO_LENGTH(A1)        ;double length of track
  340.                         ;to decode the index-sync-read data
  341.     MOVE.L    D2,D0                ;my own trackcounter
  342.     MOVE.L    D0,IO_OFFSET(A1)
  343.     MOVE.W    #TD_RAWREAD,IO_COMMAND(A1)
  344.     MOVE.B    #IOTDB_INDEXSYNC,IO_FLAGS(A1)
  345.     MOVE.L    (_SYSBASE).W,A6
  346.     JSR    _LVODOIO(A6)
  347.     TST.L    D0
  348.     BNE.W    .ERR
  349.     MOVE.L    PTB_SPACE(A5),A0
  350.     LEA.L    $7C00(A0),A1            ;end of buffer
  351.     LEA.L    $7C02(A0),A3            ;due checksum
  352.     BSR.W    TRACKDECODE
  353.     TST.L    D0
  354.     BEQ.S    .R1OK
  355.     DBF    D6,.55
  356.     BRA.W    .NOTORG
  357.  
  358. .R1OK    MOVE.W    #$140,D3
  359.     ADDQ.L    #1,D2
  360.     ST    D7                ;correct disk - nothing anymore
  361.                         ;to change
  362. .1    MOVE.B    (A3,D4.W),(A2)+
  363.     ADDQ.L    #1,D4
  364.     CMP.W    D3,D4                ;tracklength
  365.     BNE.S    .2
  366.     MOVEQ.L    #0,D4                ;new track
  367. .2
  368.     TST.L    D4
  369.     BNE.W    .3
  370.     CMP.L    #$3,D2                ;UNTIL TRACK $3 IS REACHED
  371.     BNE.W    .3
  372.  
  373.     MOVE.L    PTB_ADDRESSOFFILE(A5),A4    ;check if highscores were saved
  374.     MOVE.W    #$140-1,d0
  375. .H2    TST.B    (A4)+
  376.     BNE.S    .H
  377.     DBF    D0,.H2
  378.     MOVE.L    #HITAB,CHANGESARRAY+2*4        ;if not, generate them
  379. .H
  380.     MOVEQ.L    #0,D4
  381. .END    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;switch motor off
  382.     MOVE.L    #0,IO_L